// 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串（例如"RXXLRXRXL"）中进行移动操作。一次移动操作指用一个"LX"替换一个"XL"，或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end，请编写代码，当且仅当存在一系列移动操作使得start可以转换成end时， 返回True。

//  

// 示例 :

// 输入: start = "RXXLRXRXL", end = "XRLXXRRLX"
// 输出: True
// 解释:
// 我们可以通过以下几步将start转换成end:
// RXXLRXRXL ->
// XRXLRXRXL ->
// XRLXRXRXL ->
// XRLXXRRXL ->
// XRLXXRRLX
//  

// 提示：

// 1 <= len(start) = len(end) <= 10000。
// start和end中的字符串仅限于'L', 'R'和'X'。

#include "stdc++.h"

/* 双指针 - 不通过
可以问自己一个问题，一次移动操作之后有什么是保持不变的？
这道题的 转换不变性 在于字符串中的 'L' 和 'R' 是不会互相穿插的，也就是队伍中的人在移动过程中是不能穿过人的。这意味着开始和结束的字符串如果只看 'L' 和 'R' 的话是一模一样的。
时间复杂度：O(N)
空间复杂度：O(1)
*/
class Solution {
public:
    bool canTransform(string start, string end) {
        int n = start.size();
        int i{-1};
        int j{-1};
        while (++i < n && ++j < n) {
            while (i < n && start[i] == 'X') ++i;
            while (j < n && end[j] == 'X') ++j;
            if ((i < n) ^ (j < n)) return false;
            if (i < n && j < n) {
                if (start[i] != end[j] ||
                    (start[i] == 'L' && i < j) ||
                    (start[i] == 'R' && i > j))
                {
                    return false;
                }
            }
        }
        return true;
    }
};